package com.itheima.canal.listener;

import com.alibaba.otter.canal.protocol.CanalEntry;
import com.itheima.canal.config.RabbitMQConfig;
import com.xpand.starter.canal.annotation.CanalEventListener;
import com.xpand.starter.canal.annotation.ListenPoint;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashMap;
import java.util.Map;

/**
 * @author ZJ
 */
@CanalEventListener   //声明当前类是canal的监听类
public class SpuListener {

    @Autowired
    private RabbitTemplate rabbitTemplate;


    // eventType   : 操作数据库的类型
    //rowData   : 操作数据库的具体数据

    @ListenPoint(schema = "changgou_goods",table = "tb_spu")
    public void goodsUp(CanalEntry.EventType eventType,CanalEntry.RowData rowData){


        // 获取改变之前的数据 并将改变之前的数据转为map

        Map<String,String> oldDate = new HashMap<>();
        //1.  获取到当期改变数据的具体内容
        // 设置其中的每个元素
        rowData.getBeforeColumnsList().forEach(column -> oldDate.put(column.getName(),column.getValue()));


        //获取改变之后的数据 并将改变之后的数据转换为map

        Map<String ,String> newDate = new HashMap<>();
        rowData.getAfterColumnsList().forEach(column -> newDate.put(column.getName(),column.getValue()));



        //获取最新上架的商品  0 - >1
        //参数说明： is_marketable 代表了上下架状态
        if ("0".equals(oldDate.get("is_marketable")) && "1".equals(newDate.get("is_marketable"))){
            // 代表了这个是最新获取到上架的商品


            //将商品的spuId发送到mq中
            /**
             * 参数说明 ：
             *  1.Goods_UP_EXCHANGE  ：交换机的名称
             *  2.""   :  routingKey
             *  3.id  ：发送现在需要的spu 的id
             *
             */
            rabbitTemplate.convertAndSend(RabbitMQConfig.Goods_UP_EXCHANGE,"",newDate.get("id"));
        }


        //获取最新下架商品    1- >0
        if ("1".equals(oldDate.get("is_marketable")) && "0".equals(newDate.get("is_marketable"))){
            // 代表了这个是最新获取到上架的商品


            //将商品的spuId发送到mq中
            /**
             * 参数说明 ：
             *  1.Goods_UP_EXCHANGE  ：交换机的名称
             *  2.""   :  routingKey
             *  3.id  ：发送现在需要的spu 的id
             *
             */

            rabbitTemplate.convertAndSend(RabbitMQConfig.GOODS_DOWN_EXCHANGE,"",newDate.get("id"));
        }


        //获取最新北审核通过的商品 status 0-1
        if ("0".equals(oldDate.get("status")) && "1".equals(newDate.get("status"))){

            rabbitTemplate.convertAndSend(RabbitMQConfig.Goods_UP_EXCHANGE,"",newDate.get("id"));
        }


    }









/*
    @Autowired
    private RabbitTemplate rabbitTemplate;

    *//**
     * spu 表更新
     * @param eventType
     * @param rowData
     *//*
    @ListenPoint(schema = "changgou_goods", table = {"tb_spu"},eventType = CanalEntry.EventType.UPDATE )
    public void spuUp(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
        System.err.println("tb_spu表数据发生变化");

        //修改前数据
        Map oldMap=new HashMap<>();
        for(CanalEntry.Column column: rowData.getBeforeColumnsList()) {
            oldMap.put(column.getName(),column.getValue());
        }

        //修改后数据
        Map newMap=new HashMap<>();
        for(CanalEntry.Column column: rowData.getAfterColumnsList()) {
            newMap.put(column.getName(),column.getValue());
        }

        //is_marketable  由0改为1表示上架
        if("0".equals(oldMap.get("is_marketable")) && "1".equals(newMap.get("is_marketable")) ){
            rabbitTemplate.convertAndSend("goods_update_exchange","",newMap.get("id")); //发送到mq商品上架交换器上
        }
    }*/
}
